Circuit Breaker প্যাটার্ন মূলত মাইক্রোসার্ভিস আর্কিটেকচারে ব্যবহৃত হয়, যেখানে ব্যর্থ API কলগুলোকে হ্যান্ডল করে সার্ভিসের স্থিতিশীলতা নিশ্চিত করা হয়। Resilience4j হলো একটি জনপ্রিয় লাইব্রেরি, যা Circuit Breaker সহ অন্যান্য রেজিলিয়েন্স প্যাটার্ন সাপোর্ট করে।
pom.xml
(Maven):
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot3</artifactId>
<version>2.0.2</version> <!-- সর্বশেষ ভার্সন চেক করুন -->
</dependency>
build.gradle
(Gradle):
implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.0.2'
application.yml
ফাইলে Circuit Breaker সেটআপ:resilience4j:
circuitbreaker:
configs:
default:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 5s
instances:
myService:
baseConfig: default
slidingWindowSize: 5
waitDurationInOpenState: 10s
@CircuitBreaker
অ্যানোটেশন ব্যবহার:Resilience4j
সরাসরি @CircuitBreaker
অ্যানোটেশন দিয়ে ব্যবহার করা যায়।
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ApiService {
private final RestTemplate restTemplate;
public ApiService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
public String fetchData(String url) {
return restTemplate.getForObject(url, String.class);
}
// Fallback method
public String fallbackMethod(String url, Throwable ex) {
return "Fallback response: Service is temporarily unavailable.";
}
}
@CircuitBreaker
প্যারামিটার ব্যাখ্যা:name
: কনফিগার করা সার্ভিসের নাম (যেমন myService
).fallbackMethod
: একটি বিকল্প মেথড, যা Circuit Breaker খোলা থাকলে কল করা হবে।Circuit Breaker প্রোগ্রাম্যাটিকভাবে ব্যবহারের জন্য CircuitBreakerRegistry
ব্যবহার করা হয়।
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import org.springframework.stereotype.Service;
@Service
public class ApiServiceManual {
private final CircuitBreaker circuitBreaker;
public ApiServiceManual(CircuitBreakerRegistry circuitBreakerRegistry) {
// Custom configuration
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.slidingWindowSize(10)
.build();
this.circuitBreaker = circuitBreakerRegistry.circuitBreaker("myService", config);
}
public String fetchDataWithCircuitBreaker(String url) {
return circuitBreaker.executeSupplier(() -> {
// API call logic
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(url, String.class);
});
}
}
Resilience4j-এ Circuit Breaker ছাড়াও Retry এবং Rate Limiter ব্যবহার করা যায়।
resilience4j:
retry:
configs:
default:
maxAttempts: 3
waitDuration: 2s
instances:
myServiceRetry:
baseConfig: default
@Retry
অ্যানোটেশন ব্যবহার:import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;
@Service
public class ApiServiceWithRetry {
@Retry(name = "myServiceRetry", fallbackMethod = "fallbackMethod")
public String fetchData(String url) {
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(url, String.class);
}
public String fallbackMethod(String url, Throwable ex) {
return "Fallback response: Retry failed.";
}
}
Actuator
ব্যবহার করে Circuit Breaker এর মেট্রিক্স মনিটর করা যায়।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml
এ মেট্রিক্স এনাবল করা:management:
endpoints:
web:
exposure:
include: resilience4j.circuitbreakers
http://localhost:8080/actuator/resilience4j/circuitbreakers
@CircuitBreaker
অ্যানোটেশন বা প্রোগ্রাম্যাটিক পদ্ধতি।Actuator
ব্যবহার করে সার্ভিস মনিটর করুন।এই পদ্ধতিগুলো ব্যবহার করে আপনি Circuit Breaker প্যাটার্ন এবং Resilience4j এর মাধ্যমে আপনার স্প্রিং বুট ক্লায়েন্টকে আরও রেজিলিয়েন্ট করতে পারবেন।
Circuit Breaker Pattern একটি ডিজাইন প্যাটার্ন যা মাইক্রোসার্ভিস বা ডিসট্রিবিউটেড সিস্টেমে ব্যবহৃত হয়। এর প্রধান উদ্দেশ্য হলো নির্ভরশীল সিস্টেম বা সার্ভিসে ব্যর্থতার কারণে অ্যাপ্লিকেশনের বাকি অংশে প্রভাব পড়া থেকে রক্ষা করা। এটি এমন একটি প্রক্রিয়া যেখানে সার্ভিসে সমস্যা হলে ঐ সার্ভিসের প্রতি রিকোয়েস্ট সাময়িকভাবে বন্ধ (open) করে রাখা হয় এবং সময়মতো পুনরায় পরীক্ষা (retry) করে দেখা হয়।
Circuit Breaker তিনটি স্টেটে কাজ করে:
Spring Boot এ Circuit Breaker ইমপ্লিমেন্ট করতে Resilience4j বা Spring Cloud Circuit Breaker ব্যবহার করা হয়।
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 5000ms
permittedNumberOfCallsInHalfOpenState: 3
instances:
myCircuitBreaker:
baseConfig: default
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ApiService {
private final RestTemplate restTemplate = new RestTemplate();
@CircuitBreaker(name = "myCircuitBreaker", fallbackMethod = "fallbackResponse")
public String fetchData() {
String url = "https://api.example.com/data";
return restTemplate.getForObject(url, String.class);
}
// Fallback Method
public String fallbackResponse(Throwable t) {
return "Default Response: Service is temporarily unavailable.";
}
}
Actuator ব্যবহার করে Circuit Breaker এর স্টেট মনিটর করতে পারেন।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: resilience4j.circuitbreakers
GET http://localhost:8080/actuator/resilience4j/circuitbreakers
{
"data": "Successfully fetched data from the API."
}
{
"data": "Default Response: Service is temporarily unavailable."
}
এইভাবে, Circuit Breaker Pattern ইমপ্লিমেন্ট করে আপনি আপনার অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং নির্ভরযোগ্য করে তুলতে পারবেন।
Resilience4j হল একটি লাইটওয়েট ফ্রেমওয়ার্ক যা স্প্রিং বুট অ্যাপ্লিকেশনে ফল্ট টলারেন্স (fault tolerance) যোগ করার জন্য ব্যবহার করা হয়। এটি মাইক্রোসার্ভিস বা ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশনে সার্ভিস ব্যর্থতা থেকে রক্ষা করার জন্য কার্যকর। Resilience4j প্রধানত Circuit Breaker, Retry, Rate Limiter, Bulkhead, এবং Time Limiter সমর্থন করে।
নিচে Spring Boot-এ Resilience4j ইন্টিগ্রেশনের একটি উদাহরণ দেখানো হলো:
Spring Initializr
ব্যবহার করে একটি নতুন স্প্রিং বুট প্রজেক্ট তৈরি করুন। নিচের ডিপেনডেন্সি যুক্ত করুন:
<dependencies>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
# Circuit Breaker কনফিগারেশন
resilience4j.circuitbreaker.instances.myService.failure-rate-threshold=50
resilience4j.circuitbreaker.instances.myService.slow-call-rate-threshold=50
resilience4j.circuitbreaker.instances.myService.slow-call-duration-threshold=2s
resilience4j.circuitbreaker.instances.myService.minimum-number-of-calls=5
resilience4j.circuitbreaker.instances.myService.sliding-window-size=10
resilience4j.circuitbreaker.instances.myService.sliding-window-type=COUNT_BASED
resilience4j.circuitbreaker.instances.myService.wait-duration-in-open-state=10s
# Retry কনফিগারেশন
resilience4j.retry.instances.myService.max-attempts=3
resilience4j.retry.instances.myService.wait-duration=2s
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ApiClient {
private final RestTemplate restTemplate;
public ApiClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String fetchData(String url) {
return restTemplate.getForObject(url, String.class);
}
}
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;
@Service
public class ResilientApiClient {
private final ApiClient apiClient;
public ResilientApiClient(ApiClient apiClient) {
this.apiClient = apiClient;
}
@CircuitBreaker(name = "myService", fallbackMethod = "fallbackFetchData")
@Retry(name = "myService")
public String fetchDataWithResilience(String url) {
return apiClient.fetchData(url);
}
// ফallback method
public String fallbackFetchData(String url, Throwable throwable) {
return "Fallback response due to: " + throwable.getMessage();
}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
private final ResilientApiClient resilientApiClient;
public ApiController(ResilientApiClient resilientApiClient) {
this.resilientApiClient = resilientApiClient;
}
@GetMapping("/fetch-data")
public String fetchData() {
String url = "https://jsonplaceholder.typicode.com/posts/1"; // উদাহরণ URL
return resilientApiClient.fetchDataWithResilience(url);
}
}
@CircuitBreaker
ব্যবহার করে নির্ধারণ করা হয়।@Retry
ব্যবহার করা হয়।fallbackMethod
প্যারামিটার ব্যবহার করা হয়।INFO - CircuitBreaker 'myService' in CLOSED state.
INFO - API Response: {userId: 1, id: 1, title: "...", body: "..."}
INFO - CircuitBreaker 'myService' in OPEN state.
INFO - Fallback response due to: I/O error on GET request
Resilience4j Actuator ব্যবহার করলে Circuit Breaker এর মেট্রিক্স দেখতে পারবেন। pom.xml
-এ নিচের ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
এবং application.properties
ফাইলে Actuator সক্রিয় করুন:
management.endpoints.web.exposure.include=*
Endpoint:http://localhost:8080/actuator/circuitbreakers
Resilience4j হল Spring Boot অ্যাপ্লিকেশনে উচ্চমানের রেজিলিয়েন্স ফ্রেমওয়ার্ক। এটি
Hystrix
এর বিকল্প এবং বর্তমান সময়ে ব্যবহারযোগ্য একটি উন্নত টুল।
Resilience4j হলো একটি হালকা ওজনের ফ্রেমওয়ার্ক যা মাইক্রোসার্ভিসের মধ্যে রেসিলিয়েন্স প্যাটার্ন (যেমন: Circuit Breaker, Retry, Bulkhead, এবং TimeLimiter) সহজে প্রয়োগ করতে সাহায্য করে।
আপনার pom.xml
ফাইলে নিচের ডিপেন্ডেন্সি যুক্ত করুন:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version> <!-- আপনার প্রয়োজন অনুযায়ী ভার্সন ব্যবহার করুন -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Resilience4j এর জন্য প্রয়োজনীয় কনফিগারেশন application.yml
ফাইলে যুক্ত করুন:
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 10s
permittedNumberOfCallsInHalfOpenState: 3
minimumNumberOfCalls: 5
instances:
myService:
baseConfig: default
slidingWindowSize: 20
failureRateThreshold: 30
retry:
configs:
default:
maxAttempts: 3
waitDuration: 2s
instances:
myService:
maxAttempts: 5
waitDuration: 1s
bulkhead:
configs:
default:
maxConcurrentCalls: 10
maxWaitDuration: 0
instances:
myService:
maxConcurrentCalls: 5
timelimiter:
configs:
default:
timeoutDuration: 2s
instances:
myService:
timeoutDuration: 3s
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class MyService {
private final RestTemplate restTemplate;
public MyService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
public String callExternalService() {
return restTemplate.getForObject("http://example.com/api", String.class);
}
public String fallbackMethod(Throwable throwable) {
return "Fallback response: Service is unavailable";
}
}
import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@Retry(name = "myService", fallbackMethod = "fallbackMethod")
public String callExternalService() {
// API call logic
throw new RuntimeException("Simulated exception");
}
public String fallbackMethod(Throwable throwable) {
return "Fallback response: Retry failed";
}
}
Bulkhead প্যাটার্ন ব্যবহার করে নির্দিষ্ট সংখ্যক কনকারেন্ট কল নিয়ন্ত্রণ করা যায়।
import io.github.resilience4j.bulkhead.annotation.Bulkhead;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@Bulkhead(name = "myService", fallbackMethod = "fallbackMethod")
public String callExternalService() {
// API call logic
return "External service response";
}
public String fallbackMethod(Throwable throwable) {
return "Fallback response: Too many concurrent requests";
}
}
TimeLimiter ব্যবহার করে কোনো সার্ভিসের জন্য নির্দিষ্ট সময়সীমা নির্ধারণ করা যায়।
import io.github.resilience4j.timelimiter.annotation.TimeLimiter;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
public class MyService {
@TimeLimiter(name = "myService")
public CompletableFuture<String> callExternalService() {
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(3000); // Simulate delay
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "External service response";
});
}
}
Resilience4j এর মেট্রিক্সগুলো মনিটর করার জন্য Actuator
ব্যবহার করুন।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: resilience4j*
http://localhost:8080/actuator/resilience4j
এ মেট্রিক্স দেখতে পারবেন।
Circuit Breaker, Retry, Bulkhead, এবং TimeLimiter এর সাহায্যে মাইক্রোসার্ভিস অ্যাপ্লিকেশন আরও নির্ভরযোগ্য এবং স্কেলেবল হয়। Resilience4j ফ্রেমওয়ার্ক ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশন সহজেই এই রেসিলিয়েন্স প্যাটার্নগুলো ইমপ্লিমেন্ট করতে পারে।
Circuit Breaker Pattern হল একটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন, যা ডিস্ট্রিবিউটেড সিস্টেমে ফেইলিওর হ্যান্ডল করার জন্য ব্যবহৃত হয়। এটি একটি নির্দিষ্ট সময়ের জন্য ব্যর্থ সার্ভিস কলগুলিকে ব্লক করে এবং সার্ভিস রিকভারির সময় পুনরায় চেষ্টা করতে দেয়। Spring Boot-এ Resilience4j একটি জনপ্রিয় লাইব্রেরি যা Circuit Breaker Pattern বাস্তবায়ন করার জন্য ব্যবহৃত হয়।
নিচে একটি উদাহরণসহ Circuit Breaker Pattern Spring Boot ক্লায়েন্টে কিভাবে ব্যবহার করবেন তা দেখানো হলো।
Spring Boot-এ Resilience4j ব্যবহার করার জন্য Maven ডিপেনডেন্সি যোগ করুন।
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
Circuit Breaker-এর জন্য কনফিগারেশন সেট করুন।
resilience4j.circuitbreaker.instances.myService.register-health-indicator=true
resilience4j.circuitbreaker.instances.myService.sliding-window-size=5
resilience4j.circuitbreaker.instances.myService.failure-rate-threshold=50
resilience4j.circuitbreaker.instances.myService.wait-duration-in-open-state=5000
resilience4j.circuitbreaker.instances.myService.permitted-number-of-calls-in-half-open-state=3
বিবরণ:
failure-rate-threshold
: ব্যর্থতার হার, যা Circuit Breaker ওপেন করবে। (%)wait-duration-in-open-state
: কতক্ষণ ওপেন অবস্থায় থাকবে। (মিলিসেকেন্ড)sliding-window-size
: সর্বশেষ কতটি রিকোয়েস্ট পর্যবেক্ষণ করবে।permitted-number-of-calls-in-half-open-state
: হাফ-ওপেন অবস্থায় অনুমোদিত কলের সংখ্যা।Resilience4j এর Circuit Breaker-টি Spring Boot-এর @CircuitBreaker
এনোটেশন ব্যবহার করে সহজেই বাস্তবায়ন করা যায়।
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ApiService {
private final RestTemplate restTemplate;
public ApiService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@CircuitBreaker(name = "myService", fallbackMethod = "fallbackForFetchData")
public String fetchData() {
String url = "https://api.example.com/data";
return restTemplate.getForObject(url, String.class);
}
// ফেইলিওর হলে এখানে আসবে
public String fallbackForFetchData(Throwable throwable) {
return "Fallback response: Service is currently unavailable.";
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
private final ApiService apiService;
public ApiController(ApiService apiService) {
this.apiService = apiService;
}
@GetMapping("/data")
public String getData() {
return apiService.fetchData();
}
}
fetchData()
কাজ করবে।fallbackForFetchData()
মেথড কল হবে।Success Case:
{
"data": "Actual data from API"
}
Fallback Case:
{
"data": "Fallback response: Service is currently unavailable."
}
Circuit Breaker Pattern:
Resilience4j Spring Boot-এর সাথে Circuit Breaker বাস্তবায়নের জন্য সহজ এবং শক্তিশালী সমাধান।
Read more